package com.xlh.virtualization.service;

import com.github.pagehelper.PageInfo;
import com.xlh.virtualization.domain.*;

import java.util.List;

/**
 * 虚拟化容器 Service
 *
 * @author cheer
 */
public interface ContainerService {

    /**
     * 管理员在虚拟机管理页面中查询所有容器
     *
     * @param pageNum  第几页
     * @param pageSize 每页几条数据
     * @param userInfo 用户信息
     * @param status   容器状态
     * @return 容器分页列表
     */
    PageInfo<ContainerAttr> listContainersByPage(Integer pageNum, Integer pageSize, String userInfo, List<Integer> status);

    /**
     * 教师在课程管理-虚机管理页面中查询实验课程容器
     *
     * @param courseId 课程Id
     * @param pageNum  第几页
     * @param pageSize 每页几条数据
     * @param userInfo 用户信息
     * @param status   容器状态
     * @return 容器分页列表
     */
    PageInfo<ContainerCourseAttr> listCourseContainersByPage(Long courseId, Integer pageNum, Integer pageSize,
                                                             String userInfo, List<Integer> status);

    /**
     * 教师在环境实训-虚机管理页面中查询环境实训容器
     *
     * @param pageNum  第几页
     * @param pageSize 每页几条数据
     * @param userInfo 用户信息
     * @param status   容器状态
     * @return 容器分页列表
     */
    PageInfo<ContainerTrainingAttr> listTrainingContainersByPage(Integer pageNum, Integer pageSize, String userInfo,
                                                                 List<Integer> status);

    /**
     * 删除容器
     *
     * @param container 容器
     */
    void deleteContainer(Container container);

    /**
     * 删除容器
     *
     * @param containers 容器集合
     */
    void deleteContainer(List<Container> containers);


    /**
     * 删除停止的容器
     *
     * @param containerIds 容器Id集合
     */
    void deleteExitedContainers(List<Long> containerIds);

    /**
     * 删除指定场景的容器
     */
    void deleteContainerByContext(ContainerContext containerContext);

    /**
     * 删除多余的容器
     */
    void deleteExtraContainerByContext(ContainerContext containerContext, List<Long> containerIds);

    /**
     * 停止容器
     *
     * @param container 容器
     */
    void stopContainer(Container container);

    /**
     * 停止容器
     *
     * @param containers 容器集合
     */
    void stopContainer(List<Container> containers);

    /**
     * 停止指定场景的容器
     */
    void stopContainerByContext(ContainerContext containerContext);

    /**
     * 删除容器
     *
     * @param contextType 场景类型
     * @param contextId   场景Id
     */
    void deleteContainerByContext(Integer contextType, Long contextId);

    /**
     * 删除容器
     *
     * @param contextType 场景类型
     * @param contextIds  场景Id集合
     * @param userIds     用户Id集合
     */
    void deleteContainerByContext(Integer contextType, List<Long> contextIds, List<Long> userIds);

    /**
     * 删除容器，物理删除数据库
     *
     * @param contextType 场景类型
     * @param contextId   场景Id
     */
    void trueDeleteContainerByContext(Integer contextType, Long contextId);
}
